home *** CD-ROM | disk | FTP | other *** search
- #
- # The Python Imaging Library.
- # $Id$
- #
- # SGI image file handling
- #
- # See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli.
- # <ftp://ftp.sgi.com/graphics/SGIIMAGESPEC>
- #
- # History:
- # 1995-09-10 fl Created
- #
- # Copyright (c) 2008 by Karsten Hiddemann.
- # Copyright (c) 1997 by Secret Labs AB.
- # Copyright (c) 1995 by Fredrik Lundh.
- #
- # See the README file for information on usage and redistribution.
- #
-
-
- __version__ = "0.2"
-
-
- import Image, ImageFile
-
-
- def i16(c):
- return ord(c[1]) + (ord(c[0])<<8)
-
- def i32(c):
- return ord(c[3]) + (ord(c[2])<<8) + (ord(c[1])<<16) + (ord(c[0])<<24)
-
-
- def _accept(prefix):
- return i16(prefix) == 474
-
- ##
- # Image plugin for SGI images.
-
- class SgiImageFile(ImageFile.ImageFile):
-
- format = "SGI"
- format_description = "SGI Image File Format"
-
- def _open(self):
-
- # HEAD
- s = self.fp.read(512)
- if i16(s) != 474:
- raise SyntaxError("not an SGI image file")
-
- # relevant header entries
- compression = ord(s[2])
-
- # bytes, dimension, zsize
- layout = ord(s[3]), i16(s[4:]), i16(s[10:])
-
- # determine mode from bytes/zsize
- if layout == (1, 2, 1) or layout == (1, 1, 1):
- self.mode = "L"
- elif layout == (1, 3, 3):
- self.mode = "RGB"
- elif layout == (1, 3, 4):
- self.mode = "RGBA"
- else:
- raise SyntaxError("unsupported SGI image mode")
-
- # size
- self.size = i16(s[6:]), i16(s[8:])
-
-
- # decoder info
- if compression == 0:
- offset = 512
- pagesize = self.size[0]*self.size[1]*layout[0]
- self.tile = []
- for layer in self.mode:
- self.tile.append(("raw", (0,0)+self.size, offset, (layer,0,-1)))
- offset = offset + pagesize
- elif compression == 1:
- self.tile = [("sgi_rle", (0,0)+self.size, 512, (self.mode, 0, -1))]
-
- #
- # registry
-
- Image.register_open("SGI", SgiImageFile, _accept)
-
- Image.register_extension("SGI", ".bw")
- Image.register_extension("SGI", ".rgb")
- Image.register_extension("SGI", ".rgba")
-
- Image.register_extension("SGI", ".sgi") # really?
-